package com.ce.sys.org.action;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.omg.CORBA.portable.ApplicationException;

import com.ce.cases.report.logic.IReportIllegalLogic;
import com.ce.cases.source.dao.po.DjNsrxx;
import com.ce.framework.datamaintain.action.DataMaintainAction;
import com.ce.framework.datamaintain.logic.ISQLMapper;
import com.ce.framework.exception.AppException;
import com.ce.framework.util.DateUtil;
import com.ce.framework.util.LogUtil;
import com.ce.framework.util.StringUtil;
import com.ce.framework.util.node.JsonTreeNode;
import com.ce.framework.util.node.TreeNodeProperty;
import com.ce.sys.dict.dao.po.SysDictItem;
import com.ce.sys.login.model.User;
import com.ce.sys.org.dao.po.SysDep;
import com.ce.sys.org.dao.po.SysOrgMan;
import com.ce.sys.org.dao.po.SysOrgPro;
import com.ce.sys.org.dao.po.SysVOrg;
import com.ce.sys.person.dao.po.SysPerson;
import com.ce.util.DbUtil;
import com.ce.util.DictUtil;
import com.ce.util.OrgUtil;

/**
 * 嫦娥软件有限公司 版权所有 2013
 * 创建人： andy
 * 创建时间： 2011-5-12 下午03:18:10
 * 功能描述：用于其他子应用调用机构树的action，避免没有权限及未登陆系统的情况下不能生成机构树
 * ==================================
 * 修改历史
 * 修改人        修改时间      修改位置（函数名）
 *
 * ==================================
 */
public class UtilAction extends DataMaintainAction  {
	private static final long serialVersionUID = 1L;
	
	   private SysOrgMan orgMan ;  //根机构（段及段以上机构）
	   
	   private SysOrgPro orgPro;  //生产机构
	   
	   private SysDep    dep;     //行政机构
	   
	   private String showNewLevel; //新机构级别 单位按照 1到10级进行区分
	   
	   
		/**
		 * 机构树的类型：dep:行政部门树  org：生产机构树,默认显示全部类别机构
		 */
	  private String treeType = "";
	  
	 /**
	 *  机构树的显示深度，self：只显示本车间及其以下工区，人员为科室时不限制，仍从根机构开始，
	 *                 all:全部机构，默认为全部机构,
	 *                 selfDep: 只显示本机构和机构下的所有机构（科室部分和车间全部都是） 
	 */
	private String viewType = "";
	
	/**
	 * 机构树的显示级别，机构级别类型：1：铁道部  2：集团   3：局  4：分局  5：段  6：车间  7：工区,科室为5，设定某一级级别后，机构树只现实该级别及其以上级别
	 * 如showOrgLevel=5时，机构树显示的为1至5级别的所有机构
	 */
	private String showOrgLevel = "";
	
	private String nodeState = "closed";
	
	/**
	 * 自定义条件语句
	 */
	private String conSql="";
	
	/**
	 * 机构树是否要显示人员，默认为false，显示的话为true
	 */
	private String showUser = "";
	
	/**
	 * 显示自定义分组
	 */
	private String showGroup = "";
	
	private IReportIllegalLogic reportIllegalLogic;
	
	public void searchOrgJsonTree() throws AppException{
    	List<?> orgList = new ArrayList<Object>();
    	JSONArray jsonTree = new JSONArray();
    	SysVOrg currOrg = OrgUtil.getRootOrg();
    	User user = User.getUser();
    	//获取当前服务器所在部门下的所有机构信息
    	if("self".equals(this.getViewType())){
    		currOrg = OrgUtil.getOrg(user.getOrgManProId());
//        	if(OrgUtil.getOrgManProType(User.getUserOrgId()).equals("5")){
//        		//科室人员，获取段ID
//        		currOrg = OrgUtil.getRootOrg();
//        	}
    	}else if("selfDep".equals(this.getViewType())){
    		currOrg = OrgUtil.getOrg(User.getUserOrgId());
    	}
    	if(currOrg==null){
    		currOrg = user.getSysOrg();
    	}
    	List<Object> paraml = new ArrayList<Object>();
    	paraml.add(currOrg.getVcId());
    	String baseSql = "select * from sys_v_org$dep T start with t.VC_ID=? connect by PRIOR  t.VC_ID = t.vc_par$orgid";  //获取机构树的基本sql语句
    	StringBuffer sql  = new StringBuffer("select * from ("+baseSql+") where 1=1 ");
    	//根据treeType判断是现实生产机构树还是部门树
    	if("dep".equals(treeType)){
    		sql.append(" and VC_ORG$TYPE$FLAG='3'"); //部门树
        	paraml.add(currOrg.getVcId());
    	}else if("org".equals(treeType)){
    		sql.append(" and VC_ORG$TYPE$FLAG ='2'");  //生产机构树
    	}
    	
    	if(StringUtil.isNotBlank(showNewLevel)){
    		String[] level = this.showNewLevel.split(",");
    		sql.append(" and n_id in ("+StringUtil.fromArrayToStr(level, true)+")");
    	}
    	
//    	if(StringUtil.isNotBlank(this.showOrgLevel)){
//    		sql.append(" and VC_MAN$PRO$TYPE<="+this.showOrgLevel); //树的显示级别  
//    	}
    	if(StringUtil.isNotBlank(this.conSql)){
    		sql.append(" and "+conSql);
    	}
    	sql.append(" order by VC_ORG$LEVEL ASC,N_SEQ ASC");
    	//将通过SQL语句查询的结果集组合成SysVOrg对象的数组
    	orgList = DbUtil.executeSqlQuery(sql.toString(),new ISQLMapper(){
			public SysVOrg fromSQLQuery(ResultSet rs, int row) {
				SysVOrg view = new SysVOrg();
				try {
					view.setVcId(rs.getString("VC_ID"));
					view.setVcNumber(rs.getString("VC_NUMBER"));
					view.setVcOrgLevel(rs.getString("VC_ORG$LEVEL"));
					view.setNseq(rs.getInt("N_SEQ"));
					view.setVcName(rs.getString("VC_NAME"));
					//view.setVcType(rs.getString("VC_TYPE"));
					view.setVcDesc(rs.getString("VC_DESC"));
					view.setVcFlagLeaf(rs.getString("VC_FLAG$LEAF"));
					view.setVcParOrgid(rs.getString("VC_PAR$ORGID"));
					view.setNid(rs.getInt("N_ID"));		
					//view.setVcManProType(rs.getString("VC_MAN$PRO$TYPE"));
				} catch (SQLException e) {
					e.printStackTrace();
				}
				return view;
			}
		},paraml.toArray());
    	//设置树的根节点的信息
    	JsonTreeNode rootNode = new JsonTreeNode();//根节点
    	rootNode.setId(currOrg.getVcId());
    	rootNode.setText(currOrg.getVcName());
    	TreeNodeProperty attributes = new TreeNodeProperty();
    	attributes.setOrgType(currOrg.getVcManProType());
    	rootNode.setAttributes(attributes);
    	List<JsonTreeNode> childList = this.getChildNodeListForOrg(currOrg.getVcId(),orgList);  //获取根节点下的全部节点信息
    	if("true".equals(this.showUser)){
    	   childList.addAll(this.getUserListForOrg(rootNode));//加入根节点下的人员
    	}
    	rootNode.setChildren(childList); //加载子节点
    	jsonTree.add(rootNode);  //写入树节点信息
    	//以字符串为文件流进行输出
		writeHTML(jsonTree.toString());  //将树以JSON格式的字符串进行输出
	}

    /**
     * 开发人： andy
     * 开发时间： 2013-9-16 下午03:53:06
     * 功能描述：根据父节点的id获取子节点的机构树List，其中List中的对象为JsonTreeNode
     * 方法的参数和返回值
     * @param pid
     * @param orgList
     * @return
     * List 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    protected List<JsonTreeNode> getChildNodeListForOrg(String pid,List<?> orgList){
    	List<JsonTreeNode> rootList = new ArrayList<JsonTreeNode>();
    	//循环遍历所有机构
    	for(int i=0;i<orgList.size();i++){
    		SysVOrg org = (SysVOrg)orgList.get(i);
    		//判断机构信息，当机构的上级ID和参数pid相同时，才将该机构纳入到子节点中
    		if(pid.equals(org.getVcParOrgid())){
        		JsonTreeNode child = new JsonTreeNode();
            	child.setId(org.getVcId());
            	child.setText(org.getVcName());
            	TreeNodeProperty attributes = new TreeNodeProperty();
            	attributes.setOrgType(org.getVcManProType());
            	child.setAttributes(attributes);
            	List<JsonTreeNode> childList = this.getChildNodeListForOrg(org.getVcId(),orgList);  //递归获取的该节点的下级节点
            	if("true".equals(this.showUser)){
//            		child.setChildren(this.getUserListForOrg(child));  //加入人员
            		childList.addAll(this.getUserListForOrg(child));
            	}
            	child.setChildren(childList);
            	if(childList!=null&&childList.size()>0)  //当有子节点时默认树的状态为不展开
            	    child.setState(nodeState);
            	rootList.add(child); //将节点放入List数组中
    		}
    	}
    	return rootList;
    }
    
    
    /**
     * 开发人： andy
     * 开发时间： 2013-6-29 上午08:37:16
     * 功能描述：动态加载的人员机构树
     * 方法的参数和返回值
     * @return
     * String 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    public String getOrgTreeNodes(){//获取树的每层节点，构建动态加载树
    	JSONArray nodes = new JSONArray();
    	String pid = this.getParameter("pid");
    	if(StringUtil.isBlank(pid)){
    		pid = OrgUtil.getRootOrgId();
    	}
    	//根据treeType判断是现实生产机构树还是部门树
    	if("dep".equals(treeType)){
    		treeType = "3";  //部门
    	}else if("org".equals(treeType)){
    		treeType = "2";  //生产机构树
    	}
    	//查询指定机构及子机构
    	String sql = "select t.vc_id,t.vc_name,t.vc_par$orgid,(select count(*) from sys_v_org$dep t2 where t2.vc_par$orgid=t.vc_id) cls " +
    			"from sys_v_org$dep t where t.vc_id=? or vc_par$orgid=? order by t.n_id,t.n_seq";
    	OrgTreeNodeMapper mapper = new OrgTreeNodeMapper();
    	DbUtil.executeSqlQuery(sql, mapper,new Object[]{pid,pid});
    	Map<String,SysVOrg> map = mapper.map;//将所有节点放到MAP中
    	
    	UserTreeNodeMapper umapper = new UserTreeNodeMapper();
    	if("true".equals(this.showUser)){
        	sql = "select t2.vc_id,t2.vc_name,t.vc_id,t2.vc_mobile " +//查询相应的用户信息
    		"from sys_v_org$dep t,sys_t_person t2 where t.vc_id=t2.vc_org$id and (t.vc_id=? or vc_par$orgid=?) and t2.VC_STATUS=1 and t2.VC_DEL$FLAG=0 order by t2.n_seq";
        	DbUtil.executeSqlQuery(sql, umapper,new Object[]{pid,pid});
    	}
    	Map<String,List<JsonTreeNode>> umap = umapper.map;//将所有用户节点放到MAP中
		SysVOrg org = map.get(pid);
		JsonTreeNode root = null;
		Map<String,Object> attr = null;
		if(org!=null){//如果指定机构存在，构建机构节点树
			root = new JsonTreeNode(org.getVcId(),org.getVcName(),"icon-floder");//根机构
			attr = new HashMap<String,Object>();
			attr.put("child", "0");//将未加载组织机构的数字置为0
			attr.put("org", "1");//打上组织机构的标记
			attr.put("users", umap.get(root.getId()));//将机构下人员信息保存
			root.setAttributes(attr);
			List<JsonTreeNode> children = new ArrayList<JsonTreeNode>();
			for(String id:map.keySet()){
				org = map.get(id);
				if(pid.equals(org.getVcParOrgid())){//子机构
					JsonTreeNode n = new JsonTreeNode(org.getVcId(),org.getVcName(),"icon-floder");
					if(org.getNid()>0||umap.get(n.getId())!=null){//如果子机构下还有子机构，则设置
						n.setChildren(JsonTreeNode.TMP_LOADING_LIST);
						n.setState("closed");
					}
					attr = new HashMap<String,Object>();
					attr.put("child", org.getNid());//将未加载组织机构的数字保存，供页面中使用
					attr.put("org", "1");//打上组织机构的标记
					attr.put("users", umap.get(n.getId()));//将机构下人员信息保存
					if(umap.get(n.getId())!=null){//如果有人员，添加全选链接
						n.setText(n.getText()+" <span  class=sel-all title='选中本组人'>["+umap.get(n.getId()).size()+"]</span>");
					}
					n.setAttributes(attr);
					children.add(n);
				}
			}
			if(umap.get(root.getId())!=null){//如果根机构也有人员，将人员信息追加至children中
				children.addAll(umap.get(root.getId()));
				root.setText(root.getText()+" <span  class=sel-all title='选中本组人'>["+umap.get(root.getId()).size()+"]</span>");//添加全选链接
			}
			if(children.size()>0){
				root.setChildren(children);
			}
		}
		
		//增加自定义机构的显示(为人员机构树时该项才会起作用)
		if("true".equals(this.showGroup)&&"true".equals(this.showUser)){
			sql = "select vc_id,vc_group_name from email_t_address where vc_user_id = '" + User.getUserId() + "' and vc_del$flag = 0 ";
			List list = new ArrayList();
			list = DbUtil.executeSqlQuery(sql, new ISQLMapper(){
				public Object fromSQLQuery(ResultSet rs,int num){
					JsonTreeNode view = new JsonTreeNode();
					try{
						view.setId(rs.getString("vc_id"));
						view.setText(rs.getString("vc_group_name"));
						view.setChildren(getChildListForAddress(rs.getString("vc_id")));
						view.setState("closed");
						
				    	UserTreeNodeMapper umapper = new UserTreeNodeMapper();
				        String sql = "select t.vc_user_id,p.vc_name,'"+view.getId()+"',p.vc_mobile from email_t_address_item t,sys_t_person p where p.vc_del$flag=0 and p.VC_STATUS=1 and t.vc_user_id = p.vc_id(+) and t.vc_group_id = '" + rs.getString("vc_id") + "'";
				        DbUtil.executeSqlQuery(sql, umapper);
				    	Map<String,List<JsonTreeNode>> umap = umapper.map;//将所有用户节点放到MAP中
				    	Map<String,Object> attr = new HashMap<String,Object>();
				    	attr.put("users", umap.get(view.getId()));//将机构下人员信息保存
				    	attr.put("nodeType", "group");
						if(umap.get(view.getId())!=null){//如果有人员，添加全选链接
							view.setText(view.getText()+" <a href='#' class=sel-all title='选中本组人'>["+umap.get(view.getId()).size()+"]</a>");
						}
						view.setAttributes(attr);
						
					}catch(SQLException e) {
						e.printStackTrace();
						LogUtil.logError(e);
					}
					return view;
				}
			});
			JsonTreeNode rootNode = new JsonTreeNode();//根节点
	    	rootNode.setId("0");
	    	rootNode.setText("自定义分组");
	    	rootNode.setIconCls("icon-floder");
	    	rootNode.setChildren(list);
			nodes.add(rootNode);
		}
		nodes.add(root);
		return this.writeHTML(nodes.toString());
    }
    
    /**
     * 开发人： andy
     * 开发时间： 2013-6-29 上午08:37:16
     * 功能描述：动态加载的人员机构树
     * 方法的参数和返回值
     * @return
     * String 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    public String getOrgTreeNode(){//获取树的每层节点，构建动态加载树
    	JSONArray nodes = new JSONArray();
    	String pid = this.getParameter("pid");
    	if(StringUtil.isBlank(pid)){
    		pid = OrgUtil.getRootOrgId();
    	}
//    	//根据treeType判断是现实生产机构树还是部门树
//    	if("dep".equals(treeType)){
//    		treeType = "2";  //部门
//    	}else if("org".equals(treeType)){
//    		treeType = "1";  //生产机构树
//    	}
    	//查询指定机构及子机构
    	
    	String sqlRoot = "select t.vc_id,t.vc_name,t.vc_par$orgid,(select count(*) from sys_v_org$dep t2 where t2.vc_par$orgid=t.vc_id) cls " +
    			"from sys_v_org$dep t where (t.vc_id=?)";
    	
    	OrgTreeNodeMapper mapper2 = new OrgTreeNodeMapper();
    	DbUtil.executeSqlQuery(sqlRoot, mapper2,new Object[]{pid});
    	
    	String sql = "select t.vc_id,t.vc_name,t.vc_par$orgid,(select count(*) from sys_v_org$dep t2 where t2.vc_par$orgid=t.vc_id) cls " +
    			"from sys_v_org$dep t where (t.vc_id=? or vc_par$orgid=?)";
    	if(StringUtil.isNotBlank(treeType)){
    		sql+=" and t.VC_TYPE =?";
    	}
    	
    	sql+=" order by t.n_id,t.n_seq";
    	
    	OrgTreeNodeMapper mapper = new OrgTreeNodeMapper();
    	DbUtil.executeSqlQuery(sql, mapper,new Object[]{pid,pid,treeType});
    	Map<String,SysVOrg> map = mapper.map;//将所有节点放到MAP中
    	map.putAll(mapper2.map);
    	
    	UserTreeNodeMapper umapper = new UserTreeNodeMapper();
    	if("true".equals(this.showUser)){
        	sql = "select t2.vc_id,t2.vc_name,t.vc_id,t2.vc_mobile " +//查询相应的用户信息
    		"from sys_v_org$dep t,sys_t_person t2 where t.vc_id=t2.vc_org$id and (t.vc_id=? or vc_par$orgid=?) and t2.VC_STATUS=1 and t2.VC_DEL$FLAG=0 order by t2.n_seq";
        	
        	if(StringUtil.isNotBlank(treeType)){
        		sql+=" and t.VC_TYPE =?";
        	}
        	
        	DbUtil.executeSqlQuery(sql, umapper,new Object[]{pid,pid,treeType});
    	}
    	Map<String,List<JsonTreeNode>> umap = umapper.map;//将所有用户节点放到MAP中
		SysVOrg org = map.get(pid);
		JsonTreeNode root = null;
		Map<String,Object> attr = null;
		if(org!=null){//如果指定机构存在，构建机构节点树
			root = new JsonTreeNode(org.getVcId(),org.getVcName(),"icon-floder");//根机构
			attr = new HashMap<String,Object>();
			attr.put("child", "0");//将未加载组织机构的数字置为0
			attr.put("org", "1");//打上组织机构的标记
			attr.put("users", umap.get(root.getId()));//将机构下人员信息保存
			root.setAttributes(attr);
			List<JsonTreeNode> children = new ArrayList<JsonTreeNode>();
			for(String id:map.keySet()){
				org = map.get(id);
				if(pid.equals(org.getVcParOrgid())){//子机构
					JsonTreeNode n = new JsonTreeNode(org.getVcId(),org.getVcName(),"icon-floder");
					if(org.getNid()>0||umap.get(n.getId())!=null){//如果子机构下还有子机构，则设置
						n.setChildren(JsonTreeNode.TMP_LOADING_LIST);
						n.setState("closed");
					}
					attr = new HashMap<String,Object>();
					attr.put("child", org.getNid());//将未加载组织机构的数字保存，供页面中使用
					attr.put("org", "1");//打上组织机构的标记
					attr.put("users", umap.get(n.getId()));//将机构下人员信息保存
					if(umap.get(n.getId())!=null){//如果有人员，添加全选链接
						n.setText(n.getText()+" <span  class=sel-all title='选中本组人'>["+umap.get(n.getId()).size()+"]</span>");
					}
					n.setAttributes(attr);
					children.add(n);
				}
			}
			if(umap.get(root.getId())!=null){//如果根机构也有人员，将人员信息追加至children中
				children.addAll(umap.get(root.getId()));
				root.setText(root.getText()+" <span  class=sel-all title='选中本组人'>["+umap.get(root.getId()).size()+"]</span>");//添加全选链接
			}
			if(children.size()>0){
				root.setChildren(children);
			}
		}
		
		
		nodes.add(root);
		return this.writeHTML(nodes.toString());
    }

    @SuppressWarnings("unchecked")
	public String getChildOrgNodes(){//获取树的每层节点，构建动态加载树
    	JSONArray nodes = new JSONArray();
    	String pid = this.getParameter("pid");
    	boolean top = pid==null||"true".equals(getParameter("top"));
    	boolean getAll = "true".equals(getParameter("getAll"));//是否获取指定节点下的所有节点
    	if(pid==null){
    		pid = "self".equals(this.getViewType())?User.getUser().getOrgManProId():OrgUtil.getRootOrgId();
    	}
    	String lvls = this.getParameter("lvls");
    	if(StringUtil.isNotBlank(lvls)){
    		lvls = " and n_id in ("+lvls+") ";
    	}
    	else{
    		lvls="";
    	}
    	//根据treeType判断是现实生产机构树还是部门树
    	if("dep".equals(treeType)){
    		treeType = "3";  //部门
    	}else if("pro".equals(treeType)){
    		treeType = "2";  //生产机构树
    	}
    	
    	SysVOrg root = OrgUtil.getOrg(pid);
    	//查询指定机构及子机构
    	String sql = "select t.vc_id,t.vc_name,(select count(*) from sys_v_org$dep t2 where t2.vc_par$orgid=t.vc_id " +lvls+
    			") cls ";
    	if(getAll){
			sql += "from (select * from sys_v_org$dep start with vc_par$orgid=? connect by vc_par$orgid=prior vc_id) t where 1=1 "+lvls+
			" order by t.n_seq";
    	}else{
			sql += "from sys_v_org$dep t where t.vc_par$orgid=? "+lvls+
			" order by t.n_seq";
    	}
    	List<JsonTreeNode> list = (List<JsonTreeNode>) DbUtil.executeSqlQuery(sql, new ISQLMapper(){
			public Object fromSQLQuery(ResultSet rs, int num) {
	    		JsonTreeNode node = new JsonTreeNode();
				try {
					node.setId(rs.getString("vc_id"));
					node.setText(rs.getString("vc_name"));
					if(rs.getInt("cls")>0){
						node.setState("closed");
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
				return node;
			}
    	},new Object[]{pid,treeType,treeType});
    	if(top){
	    	JsonTreeNode r = new JsonTreeNode(root.getVcId(),root.getVcName());
	    	r.setChildren(list);
	    	nodes.add(r);
    	}
    	else{
    		nodes.addAll(list);
    	}
		return this.writeHTML(nodes.toString());
    }

	/**
	 * 下拉树中定位指定节点
	 */
	@SuppressWarnings("unchecked")
	public String focusTreeNode(){//从某一层子节点直接向上定位至根节点
    	String id = this.getParameter("id");
    	String root = this.getParameter("root");
    	if(StringUtil.isBlank(id)){//如果ID为空，则直接返回空数组
    		return this.writeHTML("[]");
    	}
    	String lvls = this.getParameter("lvls");
    	if(StringUtil.isNotBlank(lvls)){
    		lvls = " and n_id in ("+lvls+") ";
    	}
    	else{
    		lvls="";
    	}
    	//根据treeType判断是现实生产机构树还是部门树
    	if("dep".equals(treeType)){
    		treeType = "3";  //部门
    	}else if("pro".equals(treeType)){
    		treeType = "2";  //生产机构树
    	}
    	else{
    		treeType=null;
    	}
    	String[] ids = id.split(",");
    	final HashMap<String,SysVOrg> map = new LinkedHashMap<String, SysVOrg>();
    	for(String orgId:ids){
        	//查询与材料分类相关的分类列表
        	String sql = "select vc_id,vc_name,vc_par$orgid,(select count(*) from sys_v_org$dep t2 where t2.vc_par$orgid=t.vc_id " +lvls+
        			"and (t2.VC_ORG$TYPE$FLAG=1 or t2.VC_ORG$TYPE$FLAG=? or ? is null)) cls from sys_v_org$dep t where vc_par$orgid in (select vc_id " +
        			"from sys_v_org$dep start with vc_id=? connect by vc_id = prior vc_par$orgid) " +lvls+
        			"and (t.VC_ORG$TYPE$FLAG=1 or t.VC_ORG$TYPE$FLAG = ? or ? is null) order by n_id,n_seq";
        	DbUtil.executeSqlQuery(sql.toString(),new ISQLMapper(){
    			public SysVOrg fromSQLQuery(ResultSet rs, int row) {
    				SysVOrg view = new SysVOrg();
    				try {
    					view.setVcId(rs.getString("VC_ID"));
    					view.setVcName(rs.getString("VC_NAME"));
    					view.setVcParOrgid(rs.getString("VC_par$orgid"));
    					view.setNid(rs.getInt("cls"));
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    				map.put(view.getVcId(), view);
    				return view;
    			}
    		},new Object[]{treeType,treeType,orgId,treeType,treeType});
    	}
    	ArrayList<SysVOrg> list = new ArrayList<SysVOrg>();
    	for(SysVOrg org:map.values()){
    		list.add(org);
    	}
		if(list==null||list.isEmpty()){
    		return this.writeHTML("[]");
    	}
    	List<JsonTreeNode> tree = dealTreeNodes(list,OrgUtil.getOrg(root));
		JSONArray o = new JSONArray();
		o.addAll(tree);
		return this.writeHTML(o.toString());
	}

	/**
	 * 将查出的节点处理成树型结构，在材料分类维护和材料下拉树的focusTreeNode中使用
	 */
	static public List<JsonTreeNode> dealTreeNodes(List<SysVOrg> list,SysVOrg root){
    	HashMap<String,JsonTreeNode> map = new HashMap<String,JsonTreeNode>();
    	JsonTreeNode pnode=null;
    	List<JsonTreeNode> roots = new ArrayList<JsonTreeNode>();
		JsonTreeNode n = new JsonTreeNode(root.getVcId(),root.getVcName());
		n.setAttributes(root);
		map.put(n.getId(), n);//
    	roots.add(n);
    	for(SysVOrg node:list){
    		n = new JsonTreeNode(node.getVcId(),node.getVcName());
    		n.setAttributes(node);
    		if(node.getNid()>0){
    			n.setState("closed");
    		}
    		if(!map.containsKey(n.getId())){
    			map.put(n.getId(), n);//写入MAP
    		}
    	}
    	for(SysVOrg node:list){
    		if(node==null||node.getVcId()==null){
    			continue;
    		}
    		String pid = node.getVcParOrgid();//计算出父ID
    		pnode = map.get(pid);
    		n = map.get(node.getVcId());
    		if(n==null||pnode==null){//如果父ID为空，则丢弃
    			continue;
    		}
    		else{
	    		if(pnode.getChildren()==null){
	    			pnode.setChildren(new ArrayList<JsonTreeNode>());
	    			pnode.setState("open");//默认处于关闭状态
	    		}
	    		pnode.getChildren().add(n);
    		}
    	}
    	return roots;
	}

	class OrgTreeNodeMapper implements ISQLMapper{
		public Map<String,SysVOrg> map  = new LinkedHashMap<String,SysVOrg>();
		public Object fromSQLQuery(ResultSet rs, int num) {
			SysVOrg view = new SysVOrg();
			try {
				view.setVcId(rs.getString(1));
				view.setVcName(rs.getString(2));
				view.setVcParOrgid(rs.getString(3));
				view.setNid(rs.getInt(4));//NID中存放子机构数量
			} catch (SQLException e) {
				e.printStackTrace();
			}
			map.put(view.getVcId(), view);
			return view;
		}
	};
	class UserTreeNodeMapper implements ISQLMapper{
		public Map<String,List<JsonTreeNode>> map  = new LinkedHashMap<String,List<JsonTreeNode>>();
		public Object fromSQLQuery(ResultSet rs, int num) {
			JsonTreeNode view = new JsonTreeNode();
			String pid = null;
			try {
				view.setId(rs.getString(1));
				view.setText(rs.getString(2));
				view.setIconCls("icon-person");
				HashMap attrMap = new HashMap();
				attrMap.put("tel", rs.getString("vc_mobile"));
				view.setAttributes(attrMap);
				pid = rs.getString(3);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			if(map.get(pid)==null){
				map.put(pid, new ArrayList<JsonTreeNode>());
			}
			map.get(pid).add(view);
			return view;
		}
	};
    
    /**
     * 开发人： andy
     * 开发时间： 2013-5-26 上午09:39:55
     * 功能描述：获取某个机构节点下的所有人员列表
     * 方法的参数和返回值
     * @param orgNode
     * @return
     * List 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    private List<JsonTreeNode> getUserListForOrg(JsonTreeNode orgNode){
    	List<JsonTreeNode> list = new ArrayList<JsonTreeNode>();
    	try{
    		List<?> userList = this.baselogic.searchByHql("from SysPerson po where po.vcDelFlag=0 and po.vcOrgId='"+orgNode.getId()+"' order by po.nseq asc ");	
    		Iterator<?> it = userList.iterator();
    		while(it.hasNext()){
    			JsonTreeNode userNode = new JsonTreeNode();
    			SysPerson person = (SysPerson)it.next();
    			userNode.setId(person.getVcId());
    			userNode.setText(person.getVcName());
            	TreeNodeProperty attributes = new TreeNodeProperty();
            	attributes.setOrgType("0");
    			userNode.setAttributes(attributes);
    			userNode.setIconCls("icon-onliman");
    			list.add(userNode);
    		}
    	}catch(Exception e){
    		e.printStackTrace();
    	}
    	return list;
    }
    
	private List<JsonTreeNode> getChildListForAddress(String groupId) {
		String sql = "select t.vc_user_id,p.vc_name from email_t_address_item t,sys_t_person p  where p.vc_del$flag=0 and p.VC_STATUS=1 and t.vc_user_id = p.vc_id(+) and t.vc_group_id = '" + groupId + "'";
		List list = DbUtil.executeSqlQuery(sql, new ISQLMapper(){
			public Object fromSQLQuery(ResultSet rs,int num) {
				JsonTreeNode view = new JsonTreeNode();
				try{
					view.setId(rs.getString("vc_user_id"));
					view.setText(rs.getString("vc_name"));
					view.setIconCls("icon-person");
				}catch(SQLException e){
					e.printStackTrace();
				}
				return view;
			}
		});
		return list;
	}

	/**
	 * 
	 * 开发人：王廷艳
	 * 开发时间：2012-12-18 下午02:08:13 
	 * 功能描述：写邮件或公文时人员职务分组树
	 * 方法的参数和返回值
	 * @param 
	 * @return
	 * @throws ApplicationException
	 * @throws AppException
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public void getUserDutyTree(){
		String sql = "select n.vc_item$number,n.vc_item$name from SYS_T_DICT$M m, SYS_T_DICT$ITEM n where n.VC_M$ID = m.VC_ID(+) and m.VC_NAME = '人员管理_职务等级' and n.vc_item$number in(select t.VC_CHIEF$TYPE from sys_t_person t where t.vc_del$flag=0 group by t.VC_CHIEF$TYPE) order by n.n_seq asc ";
		List list = new ArrayList();
		list = DbUtil.executeSqlQuery(sql, new ISQLMapper(){
			public Object fromSQLQuery(ResultSet rs,int num){
				JsonTreeNode view = new JsonTreeNode();
				try{
					view.setId(rs.getString("vc_item$number"));
					view.setText(rs.getString("vc_item$name"));
					view.setChildren(getChildListForDuty(rs.getString("vc_item$number")));
					view.setState("closed");
					
			    	UserTreeNodeMapper umapper = new UserTreeNodeMapper();
			        String sql = "select s.vc_id,s.vc_name,'"+view.getId()+"',s.vc_mobile from sys_t_person s where s.vc_del$flag=0 and s.VC_STATUS=1 and s.VC_CHIEF$TYPE = '" + rs.getString("vc_item$number") + "' order by s.n_seq";
			        DbUtil.executeSqlQuery(sql, umapper);
			    	Map<String,List<JsonTreeNode>> umap = umapper.map;//将所有用户节点放到MAP中
			    	Map<String,Object> attr = new HashMap<String,Object>();
			    	attr.put("users", umap.get(view.getId()));//将机构下人员信息保存
			    	attr.put("nodeType", "group");
					if(umap.get(view.getId())!=null){//如果有人员，添加全选链接
						view.setText(view.getText()+" <span class=sel-all>["+umap.get(view.getId()).size()+"]</span>");
					}
					view.setAttributes(attr);
					
				}catch(SQLException e) {
					e.printStackTrace();
					LogUtil.logError(e);
				}
				return view;
			}
		});
		JSONArray jsonTree = new JSONArray();
		JsonTreeNode rootNode = new JsonTreeNode();//根节点
    	rootNode.setId("0");
    	rootNode.setText("按职务分组");
    	rootNode.setIconCls("icon-floder");
    	rootNode.setChildren(list);
    	jsonTree.add(rootNode);  //写入树节点信息
    	//以字符串为文件流进行输出
		writeHTML(jsonTree.toString());  //将树以JSON格式的字符串进行输出
	}
	
	private List<JsonTreeNode> getChildListForDuty(String groupId) {
		String sql = "select s.vc_id,s.vc_name from sys_t_person s where s.vc_del$flag=0 and s.VC_STATUS=1 and s.VC_CHIEF$TYPE = '" + groupId + "' order by s.n_seq";
		List list = DbUtil.executeSqlQuery(sql, new ISQLMapper(){
			public Object fromSQLQuery(ResultSet rs,int num) {
				JsonTreeNode view = new JsonTreeNode();
				try{
					view.setId(rs.getString("vc_id"));
					view.setText(rs.getString("vc_name"));
					view.setIconCls("icon-person");
				}catch(SQLException e){
					e.printStackTrace();
				}
				return view;
			}
		});
		return list;
	}
	/**
	 * 
	 * 开发人：张波
	 * 开发时间：2013-06-13
	 * 功能描述：字典项目
	 * 方法的参数和返回值
	 * @param 
	 * @return
	 * @throws ApplicationException
	 * @throws AppException
	 */
	public void searchSysDictJsonTree() throws AppException {
		String dictName=this.getParameter("dictName");
		List dictList=DictUtil.getDictListByName(dictName);
    	StringBuffer json = new StringBuffer("[");
    	for(int i = 0; i < dictList.size(); i++) {
    		SysDictItem dict = (SysDictItem)dictList.get(i);
    		json.append("{\"id\":\"").append(dict.getVcItemNumber()).append("\",\"text\":\"").append(dict.getVcItemName()).append("\"}");
    		if (i != dictList.size() - 1) {
				json.append(",");
			}
    	}
    	json.append("]");
    	writeHTML(json.toString());
	}
	
	/**
	 * 
	 * 开发人：张波
	 * 开发时间：2013-06-13
	 * 功能描述：字典项目
	 * 方法的参数和返回值
	 * @param 
	 * @return
	 * @throws ApplicationException
	 * @throws AppException
	 */
	public void getInspectionList() throws AppException {
		String id=this.getParameter("id");
		if(StringUtil.isBlank(id))
			id=OrgUtil.getRootOrgId();
		List orglist = DbUtil.executeHql("from SysVOrg po where po.vcType=1  and po.vcParOrgid = '"+id+"'");
    	StringBuffer json = new StringBuffer("[");
    	for(int i = 0; i < orglist.size(); i++) {
    		SysVOrg dict = (SysVOrg)orglist.get(i);
    		json.append("{\"id\":\"").append(dict.getVcId()).append("\",\"text\":\"").append(dict.getVcName()).append("\"}");
    		if (i != orglist.size() - 1) {
				json.append(",");
			}
    	}
    	json.append("]");
    	writeHTML(json.toString());
	}
	/*
	 * 获取稽查局
	 */
	public String getInspectionBureauList(){

		String id = this.getParameter("id");
		System.out.println("com.ce.sys.org.action.UtilAction.java.getInspectionBureauList()=>获取稽查局 SYS_V_ORG$DEP.VC_PAR$ORGID =  " + id);
		if(StringUtil.isBlank(id))
			id=OrgUtil.getRootOrgId();
		List orglist = DbUtil.executeHql("from SysVOrg po where po.vcType=1  and po.vcParOrgid = '"+id+"'");
		JSONArray json = new JSONArray();
		json.add(orglist);
		return super.writeHTML(json.toString());
	}
	/*
	 * 获取征管局
	 */
	public String getCollectionBureauList(){

		String id = this.getParameter("id");
		System.out.println("com.ce.sys.org.action.UtilAction.java.getCollectionBureauList()=>获取征管局 SYS_V_ORG$DEP.VC_PAR$ORGID = " + id);
		List orglist = DbUtil.executeHql("from SysVOrg po where  po.vcType = 1  and po.vcParOrgid = '"+id+"'");
		JSONArray json = new JSONArray();
		json.add(orglist);
		return super.writeHTML(json.toString());
	}

	/**
	 * 注释：zl
	* @时间查询征管系统---Nsrxx对象
	* @2015年9月9日17:34:21
	 * 时间:2017年7月31日10:29:30 \n
	 * 修改获取Connection 为C3p0 链接池方式
	* */
	public String getNsrinfoByTaxpayerNumber()
	{
    	String taxpayerNumber=this.getParameter("taxpayerNumber");
    	DjNsrxx po=reportIllegalLogic.getDjNsrxxRemote(taxpayerNumber);

    	if(null!=po)
		{
			System.out.println("com.ce.sys.org.action.UtilAction.getNsrinfoByTaxpayerNumber()=> 主管税务机关代码》= " + po.getZgswjDm());
			SysVOrg jcjorg=OrgUtil.getParOrg(po.getZgswjDm());//根据 Nsrxx对象中-征管税务局代码 查询  /*视图--根据组织机构ID获取它-上级机构ID*/
			//SysVOrg jcjorg=OrgUtil.getOrg(po.getZgswjDm()); //以税务机关代码为主键  查询  组织机构 对象记录
			System.out.println("com.ce.sys.org.action.UtilAction.getNsrinfoByTaxpayerNumber()=>  组织机构代码》 sys_t_org.VC_ID= " + jcjorg.getVcId()+"\n\n");
    		if(jcjorg!=null)
			{
    			po.setZgswjMc(OrgUtil.getOrgName(po.getZgswjDm()));
            	po.setJcjdm(jcjorg.getVcId());
							System.out.println("com.ce.sys.org.action.UtilAction.getNsrinfoByTaxpayerNumber()=>稽查局代码 VC_ID = " + jcjorg.getVcId());
				po.setJcjmc(jcjorg.getVcName());
							System.out.println("com.ce.sys.org.action.UtilAction.getNsrinfoByTaxpayerNumber()=>稽查局名称 VC_ID = " + jcjorg.getVcName());
            	String year=DateUtil.getYear();
            	String sql="select count(*) from CASE_SOURCE t where t.INSPECTION_DEPT_ID='"+jcjorg.getVcId()+"' and t.vc_del$flag='0'";
            	int cnt=DbUtil.getFirstIntSqlQuery(sql);
            	String cnt_="";
            	if(cnt<10)
            		cnt_="00"+cnt;
            	else if(cnt<100)
            		cnt_="0"+cnt;
            	else 
            		cnt_=""+cnt;
            	po.setStatusInfo(year+"DX-J"+jcjorg.getNseq()+"-"+cnt_);//待选案源编号
    		}
			else
			{
				String zgswjdm="根据-主管税务机关代码 = \"+po.getZgswjDm()+\" 没有查询到所属征管局信息\n请登陆核心征管确认纳税人所属税务机关是否正确.";
				System.out.println("890-"+zgswjdm);
				return this.returnInfoForJS(false, "对不起，纳税人所属征管局信息错误，请登陆核心征管确认纳税人所属征管局是否正确.");
    		}
    		return writeHTML(JSONObject.fromObject(po).toString());
    	}
    	else
    		return this.returnInfoForJS(false, "对不起，没有获取到纳税人信息，请确认输入的纳税人编号是否正确,或者查询核心征管系统确认该纳税人编号是否存在.");
    }
	/**
	 * @author ： andy
	 * @since： 2013-1-10 上午11:34:40
	 * 功能描述：用于首页模板动态获取登陆人员名称
	 * 方法的参数和返回值
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String getLoginUserName(){
		return super.returnInfoForJS(true, User.getUserName()); 
	}

	public String loadUserInfo(){
		User user = User.getUser();
		return writeHTML(user==null?"":user.getVcName());
	}

	public SysOrgMan getOrgMan() {
		return orgMan;
	}

	public void setOrgMan(SysOrgMan orgMan) {
		this.orgMan = orgMan;
	}

	public SysOrgPro getOrgPro() {
		return orgPro;
	}

	public void setOrgPro(SysOrgPro orgPro) {
		this.orgPro = orgPro;
	}

	public SysDep getDep() {
		return dep;
	}

	public void setDep(SysDep dep) {
		this.dep = dep;
	}

	public String getTreeType() {
		return treeType;
	}

	public void setTreeType(String treeType) {
		this.treeType = treeType;
	}

	public String getViewType() {
		return viewType;
	}

	public void setViewType(String viewType) {
		this.viewType = viewType;
	}
	
	public String getShowOrgLevel() {
		return showOrgLevel;
	}

	public void setShowOrgLevel(String showOrgLevel) {
		this.showOrgLevel = showOrgLevel;
	}

	public String getShowUser() {
		return showUser;
	}

	public void setShowUser(String showUser) {
		this.showUser = showUser;
	}

	public String getConSql() {
		return conSql;
	}

	public void setConSql(String conSql) {
		this.conSql = conSql;
	}

	public String getNodeState() {
		return nodeState;
	}

	public void setNodeState(String nodeState) {
		this.nodeState = nodeState;
	}

	public String getShowNewLevel() {
		return showNewLevel;
	}

	public void setShowNewLevel(String showNewLevel) {
		this.showNewLevel = showNewLevel;
	}

	public String getShowGroup() {
		return showGroup;
	}

	public void setShowGroup(String showGroup) {
		this.showGroup = showGroup;
	}

	public void setReportIllegalLogic(IReportIllegalLogic reportIllegalLogic) {
		this.reportIllegalLogic = reportIllegalLogic;
	}
	

}
